package com.jiangruan.javaproject.request;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Map;
import java.util.Set;

/**
 * @author zhongjun
 * @ClassName com.jiangruan.javaproject.request.HttpUtils
 * @create 2021年12月06日 21:14
 * @desc:该类用于封装提供网络请求的代码，用于发起网络请求。并将网络的数据进行返回
 */
public class HttpUtils {

    /**
     * 该函数用于实现get请求，并将请求的结果进行返回
     * @param path 请求的资源路径
     * @return 请求的结果
     */
    public static String get(String path){
        InputStream inputStream = null;
        InputStreamReader inputStreamReader = null;
        BufferedReader reader = null;


        String line = "";//最开始空行
        String result ="";//每次读取到以后都要累计起来的读取结果

        try {

            //Union Resource Location 统一资源定位
            URL url = new URL(path);
            URLConnection conn= url.openConnection();
            //用于发起连接
            conn.connect();

             inputStream = conn.getInputStream();

            //字符流：按行读
            //字节流转换字符流
             inputStreamReader= new InputStreamReader(inputStream);
            reader= new BufferedReader(inputStreamReader);
//            String line =  reader.readLine();
//           while (line !=null){
//               reader.readLine();
//           }
            while ((line =reader.readLine()) !=null){
                result +=  line;
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭读取流
            try {
                if (reader != null) {

                    reader.close();
                }
                if (inputStreamReader !=null){
                    inputStreamReader.close();
                }
                if (inputStreamReader !=null){
                    inputStream.close();
                }
            }catch (IOException e) {
                    e.printStackTrace();
                }

        }
        return result;

    }
    /*
    * 该方法用于实现发送一个post请求，并将请求的 解析到返回
    *path 要请求的资源路径
    * header  请求头信息
    *data 请求体数据
    * return 请求的响应结果
    * */
    public static  String post(String path, Map<String,String> header,byte[] data){
       BufferedReader reader =null;//读取响应结果的字符读取流
        OutputStream outPut=null;
        String result ="";//最后的结果
        try {
            URL url =new URL(path);
          HttpURLConnection conn=(HttpURLConnection) url.openConnection();
          conn.setRequestMethod("POST");//设置为post请求

          conn.setDoInput(true);//允许从服务端接受数据
          conn.setDoOutput(true);//允许向服务端发送数据
            //设置请求头
            if (!header.isEmpty()){//如果请求头不为空，则要将用户需要 设置的属性设置到请求头中
            //java中如何遍历map
               Set<String> keys= header.keySet();
               //java中如何遍历set
                for (String key : keys){
                    String value= header.get(key);
                    //将拿到的key和value设置到请求头属性中
                    conn.setRequestProperty(key,value);
                }


            }
            //先连接
            conn.connect();

            //输出流
            outPut= conn.getOutputStream();
            //将要请求的数据发送出去（发送到服务器）
            outPut.write(data);
            outPut.flush();

            //接受响应数据
           reader =new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line =null;
            while ((line =reader.readLine())!=null){
                result += line;
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
            if (reader!=null){

                    reader.close();

            }
            if (outPut!=null){
                outPut.close();
            }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
}
